home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / test / test19.c < prev    next >
C/C++ Source or Header  |  1990-07-20  |  5KB  |  315 lines

  1. /* test 19 */
  2.  
  3. #include <signal.h>
  4. #include <errno.h>
  5. #include <stdio.h>
  6.  
  7. #define MAX_ERROR 4
  8.  
  9. extern int errno;
  10. int errct;
  11. int subtest = 1;
  12.  
  13. int func1(), func10(), func8(), funcalrm(), func11();
  14. int childsigs, parsigs, alarms;
  15. int zero[1024];
  16.  
  17. main()
  18. {
  19.   int i;
  20.  
  21.   printf("Test 19 ");
  22.   fflush(stdout);        /* have to flush for child's benefit */
  23.  
  24.   for (i = 0; i < 1; i++) {
  25.     test50();
  26.     test51();
  27.     test53();
  28.     test54();
  29.     test55();
  30. /*    test56(); */
  31.     test57();
  32.   }
  33.   if (errct == 0)
  34.     printf("ok\n");
  35.   else
  36.     printf("%d errors\n", errct);
  37.   exit(0);
  38. }
  39.  
  40.  
  41.  
  42. test50()
  43. {
  44.   int parpid, childpid, flag, *zp;
  45.  
  46.   flag = 0;
  47.   for (zp = &zero[0]; zp < &zero[1024]; zp++)
  48.     if (*zp != 0) flag = 1;
  49.   if (flag) e(0);        /* check if bss is cleared to 0 */
  50.   if (signal(1, func1) < 0) e(1);
  51.   if (signal(10, func10) < 0) e(2);
  52.   parpid = getpid();
  53.   if (childpid = fork()) {
  54.     if (childpid < 0) ex();
  55.     parent(childpid);
  56.   } else {
  57.     child(parpid);
  58.   }
  59.   if (signal(1, SIG_DFL) < 0) e(4);
  60.   if (signal(10, SIG_DFL) < 0) e(5);
  61. }
  62.  
  63. parent(childpid)
  64. int childpid;
  65. {
  66.   int i;
  67.  
  68.   for (i = 0; i < 3; i++) {
  69.     if (kill(childpid, 1) < 0) e(6);
  70.     while (parsigs == 0);
  71.     parsigs--;
  72.   }
  73.   if (wait(&i) < 0) e(7);
  74.   if (i != 256 * 6) e(8);
  75. }
  76.  
  77. child(parpid)
  78. int parpid;
  79. {
  80.  
  81.   int i;
  82.  
  83.   for (i = 0; i < 3; i++) {
  84.     while (childsigs == 0);
  85.     childsigs--;
  86.     if (kill(parpid, 10) < 0) e(9);
  87.   }
  88.   exit(6);
  89. }
  90.  
  91. func1()
  92. {
  93.   if (signal(1, func1) < 0) e(10);
  94.   childsigs++;
  95. }
  96.  
  97. func10()
  98. {
  99.   if (signal(10, func10) < 0) e(11);
  100.   parsigs++;
  101. }
  102.  
  103.  
  104. test51()
  105. {
  106.   int cpid, n, pid;
  107.  
  108.   if ((pid = fork())) {
  109.     if (pid < 0) ex();
  110.     if ((pid = fork())) {
  111.         if (pid < 0) ex();
  112.         if (cpid = fork()) {
  113.             if (cpid < 0) ex();
  114.             if (kill(cpid, 9) < 0) e(12);
  115.             if (wait(&n) < 0) e(13);
  116.             if (wait(&n) < 0) e(14);
  117.             if (wait(&n) < 0) e(15);
  118.         } else {
  119.             pause();
  120.             while (1);
  121.         }
  122.     } else {
  123.         exit(0);
  124.     }
  125.   } else {
  126.     exit(0);
  127.   }
  128. }
  129.  
  130. test52()
  131. {
  132.   int pid, n, k;
  133.  
  134.   pid = getpid();
  135.   if (getpid() == pid) k = fork();    /* only parent forks */
  136.   if (k < 0) ex();
  137.   if (getpid() == pid) k = fork();    /* only parent forks */
  138.   if (k < 0) ex();
  139.   if (getpid() == pid) k = fork();    /* only parent forks */
  140.   if (k < 0) ex();
  141.  
  142.   if (getpid() == pid) {
  143.     if (kill(0, 9) < 0) e(16);
  144.     if (wait(&n) < 0) e(17);
  145.     if (wait(&n) < 0) e(18);
  146.     if (wait(&n) < 0) e(19);
  147.   } else
  148.     pause();
  149. }
  150.  
  151. int sigmap[5] = {9, 10, 11};
  152. test53()
  153. {
  154.   int n, i, pid, wpid;
  155.  
  156.   /* Test exit status codes for processes killed by signals. */
  157.   for (i = 0; i < 3; i++) {
  158.     if (pid = fork()) {
  159.         if (pid < 0) ex();
  160.         sleep(3);    /* wait for child to pause */
  161.         if (kill(pid, sigmap[i]) < 0) {
  162.             e(20);
  163.             exit(1);
  164.         }
  165.         if ((wpid = wait(&n)) < 0) e(21);
  166.         if ((n & 077) != sigmap[i]) e(22);
  167.         if (pid != wpid) e(23);
  168.     } else {
  169.         pause();
  170.         exit(0);
  171.     }
  172.   }
  173. }
  174.  
  175. test54()
  176. {
  177. /* Test alarm */
  178.  
  179.   int i;
  180.  
  181.   alarms = 0;
  182.   for (i = 0; i < 8; i++) {
  183.     signal(SIGALRM, funcalrm);
  184.     alarm(1);
  185.     pause();
  186.     if (alarms != i + 1) e(24);
  187.   }
  188. }
  189.  
  190.  
  191.  
  192. test55()
  193. {
  194. /* When a signal knocks a processes out of WAIT or PAUSE, it is supposed to
  195.  * get EINTR as error status.  Check that.
  196.  */
  197.   int n, j, i;
  198.  
  199.   if (signal(8, func8) < 0) e(25);
  200.   if (n = fork()) {
  201.     /* Parent must delay to give child a chance to pause. */
  202.     if (n < 0) ex();
  203.     sleep(1);
  204.     if (kill(n, 8) < 0) e(26);
  205.     if (wait(&n) < 0) e(27);
  206.     if (signal(8, SIG_DFL) < 0) e(28);
  207.   } else {
  208.     j = pause();
  209.     if (errno != EINTR && -errno != EINTR) e(29);
  210.     exit(0);
  211.   }
  212. }
  213.  
  214. func8()
  215. {
  216. }
  217.  
  218. test56()
  219. {
  220.   int i, j, k, n;
  221.  
  222.   n = fork();
  223.   if (n < 0) ex();
  224.   if (n) {
  225.     wait(&i);
  226.     i = (i >> 8) & 0377;
  227.     if (i != (n & 0377)) e(30);
  228.   } else {
  229.     i = getgid();
  230.     j = getegid();
  231.     k = (i + j + 7) & 0377;
  232.     if (setgid(k) < 0) e(31);
  233.     if (getgid() != k) e(32);
  234.     if (getegid() != k) e(33);
  235.     i = getuid();
  236.     j = geteuid();
  237.     k = (i + j + 1) & 0377;
  238.     if (setuid(k) < 0) e(34);
  239.     if (getuid() != k) e(35);
  240.     if (geteuid() != k) e(36);
  241.     i = getpid() & 0377;
  242.     if (wait(&j) != -1) e(37);
  243.     exit(i);
  244.   }
  245. }
  246.  
  247. func11()
  248. {
  249.   e(38);
  250. }
  251.  
  252.  
  253. test57()
  254. {
  255.   int n;
  256.  
  257.   signal(11, func11);
  258.   signal(11, SIG_IGN);
  259.   n = getpid();
  260.   kill(n, 11);
  261.   signal(11, SIG_DFL);
  262. }
  263.  
  264. funcalrm()
  265. {
  266.   alarms++;
  267. }
  268.  
  269.  
  270. test58()
  271. {
  272. /* When a signal knocks a processes out of PIPE, it is supposed to
  273.  * get EINTR as error status.  Check that.
  274.  */
  275.   int n, j, i, fd[2];
  276.  
  277.   if (signal(8, func8) < 0) e(38);
  278.   pipe(fd);
  279.   if (n = fork()) {
  280.     /* Parent must delay to give child a chance to pause. */
  281.     if (n < 0) ex();
  282.     sleep(3);
  283.     if (kill(n, 8) < 0) e(39);
  284.     if (wait(&n) < 0) e(40);
  285.     if (signal(8, SIG_DFL) < 0) e(41);
  286.     close(fd[0]);
  287.     close(fd[1]);
  288.   } else {
  289.     j = read(fd[0], &n, 1);
  290.     if (errno != EINTR) e(42);
  291.     exit(0);
  292.   }
  293. }
  294.  
  295. ex()
  296. {
  297.   printf("Test 5.  fork failed.  Errno=%d\n", errno);
  298.   exit(1);
  299. }
  300.  
  301.  
  302. e(n)
  303. int n;
  304. {
  305.   int err_num = errno;        /* save errno in case printf clobbers it */
  306.  
  307.   printf("Subtest %d,  error %d  errno=%d  ", subtest, n, errno);
  308.   errno = err_num;        /* restore errno, just in case */
  309.   perror("");
  310.   if (errct++ > MAX_ERROR) {
  311.     printf("Too many errors; test aborted\n");
  312.     exit(1);
  313.   }
  314. }
  315.